// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.chat_group.utils;

import android.content.Context;
import android.util.Log;

import com.eva.epc.common.util.CommonUtils;
import com.x52im.rbchat.MyApplication;
import com.x52im.rainbowchat.im.dto.ChatType;
import com.x52im.rainbowchat.im.dto.MsgType;
import com.x52im.rbchat.logic.chat_guest.utils.TChatDataHelper;
import com.x52im.rbchat.logic.chat_root.model.MessageExt;
import com.x52im.rbchat.logic.sns_group.JoinGroupActivity;
import com.x52im.rbchat.utils.PreferencesToolkits;
import com.x52im.rainbowchat.http.logic.dto.GroupEntity;
import com.x52im.rainbowchat.http.logic.dto.GroupMemberEntity;
import com.x52im.rainbowchat.im.dto.MsgBody4Group;
import com.x52im.rbchat.logic.chat_root.model.Message;
import com.x52im.rbchat.logic.chat_friend.utils.ChatDataHelper;
import com.x52im.rbchat.utils.NotificationPromptHelper;
import com.x52im.rbchat.utils.PromtHelper;
import com.x52im.rbchat.utils.ToolKits;

import java.util.ArrayList;

/**
 * 群聊天的UI相关显示数据操作实用类.
 * 
 * @author Lu
 * @version 1.0
 * @since 2.4
 * @see ChatDataHelper
 * @see TChatDataHelper
 */
public class GChatDataHelper
{
	private final static String TAG = GChatDataHelper.class.getSimpleName();

	/**
	 * 往聊天界面中显示一条"我"通过扫描二维码加入群聊成功这样的提示信息（此通知并非服务器发出，而是本地准备好的，仅用UI显示）。
	 *
	 * @param context 上下文
	 * @param sharedByNickname 二维分享者的昵称
	 * @param gid 群id
	 * @param gname 群名称
	 * @param memberCount 群当前总人数（含本次"我"自已）
	 */
	public static void addSystemInfo_joinGroupSucess(Context context, int joinBy, String sharedByNickname, String gid, String gname, int memberCount){

		String hint = "";
		if(joinBy == JoinGroupActivity.JOIN_BY_SCAN_QRCODE) {
			hint = "你通过扫描"+(!CommonUtils.isStringEmpty(sharedByNickname, true)?"\""+sharedByNickname+"\"分享的":"")
				+"二维码加入群聊"+(memberCount>0?"，当前群聊参与者共"+memberCount+"人":"")+"。";
		} else {
			hint = "你通过"+(!CommonUtils.isStringEmpty(sharedByNickname, true)?"\""+sharedByNickname+"\"分享的":"")
					+"群名片加入群聊"+(memberCount>0?"，当前群聊参与者共"+memberCount+"人":"")+"。";
		}
		GChatDataHelper.addSystemInfoData(context, gid, gname, hint, 0, false, false);
	}

	/**
	 * 往聊天界面中显示一条被"我"(我就是群主自已了，不然哪有转让权限)转让群主权限成功的系统通知给"自已"看（此
	 * 通知并非服务器发出，而是本地准备好的，仅用UI显示）。
	 *
	 * @param context
	 * @param beTransferNickname
	 * @param gid
	 * @param gname
	 */
	public static void addSystenInfo_transferSucessForLocalUser(Context context
			, String beTransferNickname, String gid, String gname)
	{
		if(beTransferNickname != null) {
			String hint = "你已将群主权限转让给\""+beTransferNickname+"\"";
			GChatDataHelper.addSystemInfoData(context, gid, gname, hint, 0, false, false);
		}
	}

	/**
	 * 往聊天界面中显示一条被"我"(我就是群主自已了，不然哪有移除权限)删除群员成功的系统通知给"自已"看（此
	 * 通知并非服务器发出，而是本地准备好的，仅用UI显示）。
	 *
	 * @param context
	 * @param beRemovedMembers
	 * @param gid
	 * @param gname
	 */
	public static void addSystenInfo_removeMembersSucessForLocalUser(Context context
			, ArrayList<GroupMemberEntity> beRemovedMembers, String gid, String gname)
	{
		int size = beRemovedMembers.size();
		if(beRemovedMembers != null && size > 0)
		{
			String beInvitedNames = null;
			if (size > 1)
				beInvitedNames = "\""+beRemovedMembers.get(0).getNickname() + " 等\" " + size + "人";
			else
				beInvitedNames = "\""+beRemovedMembers.get(0).getNickname()+"\"";

			String hint = "你将" + beInvitedNames + "移出了本群";
			GChatDataHelper.addSystemInfoData(context, gid, gname, hint, 0, false, false);
		}
	}

	/**
	 * 往聊天界面中显示一条被"我"邀请入群成功的系统通知给"自已"看（此通知并非服务器发出，而是本地准备好的，仅用UI显示）。
	 *
	 * @param context
	 * @param beInvitedMembers
	 * @param gid
	 * @param gname
	 */
	public static void addSystenInfo_inviteMembersSucessForLocalUser(Context context
			, ArrayList<GroupMemberEntity> beInvitedMembers, String gid, String gname)
	{
		int size = beInvitedMembers.size();
		if(beInvitedMembers != null && size > 0)
		{
			String beInvitedNames = null;
			if (size > 1)
				beInvitedNames = "\""+beInvitedMembers.get(0).getNickname() + " 等\" " + size + "人";
			else
				beInvitedNames = "\""+beInvitedMembers.get(0).getNickname()+"\"";

			String hint = "你邀请" + beInvitedNames + "加入了群聊";
			GChatDataHelper.addSystemInfoData(context
					, gid, gname, hint, 0, false, false);
		}
	}

	/**
	 * 往聊天界面中显示一条群名被"我"自已修改的系统通知给"自已"看（此通知并非服务器发出，而是本地准备好的，仅用UI显示）。
	 *
	 * @param context
	 * @param gid
	 * @param newGroupname
	 */
	public static void addSystemInfo_groupNameChangedForLocalUser(Context context, String gid, String newGroupname)
	{
		String hint = "你已将群名修改为\""+newGroupname+"\"";
		GChatDataHelper.addSystemInfoData(context, gid, newGroupname, hint, 0, false, false);
	}

	/**
	 * 添加一条通用群聊系统通知到聊天数据结构中.
	 *
	 * @param context
	 * @param systemInfo
	 * @param showNotification
	 */
	public static void addSystemInfoData(Context context, String gid
			, String gname, String systemInfo, long time, boolean showNotification, boolean playPromtAudio)
	{
		// 将该条系统通知加入到聊天消息中
		MsgBody4Group msgBody = MsgBody4Group.constructGroupSystenMsgBody(gid, systemInfo);
		GChatDataHelper.addChatMessageData_incoming(context, null,gid, gname , msgBody, time, showNotification, playPromtAudio);
	}

	/**
	 * 添加一条群聊/频道普通聊天消息到数据结构中.
	 *
	 * @param context
	 * @param fingerPrint 该条消息的指令码（也就是消息唯一ID）
	 * @param msgBody
	 * @param showNotification
	 */
	public static void addChatMessageData_incoming(Context context
			, String fingerPrint, String gid, String gname, MsgBody4Group msgBody, long time
			, boolean showNotification, boolean playPromtAudio) {

		int msgType = msgBody.getTy();

		// 如果收到的消息"撤回指令"，则需要单独特殊处理（因为"撤回"指令不是普通的聊天消息哦）
		if(msgType == MsgType.TYPE_REVOKE){

			Log.i(TAG, "【这是消息撤回指令，马上处理撤回逻辑】 ==> msgType="+msgType+"，fingerPrint = "+fingerPrint+"，messageContent="+msgBody.getM());

			// 开始处理撤回指令完整逻辑
			ChatDataHelper.processRevokeMessage_incoming(ChatType.CHAT_TYPE_GROUP$CHAT, fingerPrint, gid, msgBody.getM());

//			// 消息内容的显示（比如图片消息会显示"[图片]"这样的字串）
//			String messageContentForShow = MessageExt.parseMessageContentPreview(context, msgBody.getM(), msgType);

			// 世界频道的
			if(GroupEntity.isWorldChat(gid)) {
				// 无条件加一个提示到首页消息界面中
				MyApplication.getInstance(context).getIMClientManager().getAlarmsProvider().setBBSMsgAlarm(msgBody, 0 );// 未读数 TODO: 未来做到极致优化：如果该被撤回的消息处于未读数中则将未读数-1
			}
			// 普通群聊的
			else {
				// 更新首页消息列表中的显示
				MyApplication.getInstance(context).getIMClientManager().getAlarmsProvider().addAGroupChatMsgAlarm(
						msgBody.getTy()
						, gid
						, gname
						, msgBody.getNickName()  // 群聊消息发起者的昵称
						, msgBody.getM()         // 消息内容
						, time
						, 0 // 未读数 TODO: 未来做到极致优化：如果该被撤回的消息处于未读数中则将未读数-1
				);
			}
			return;
		}

		//***************************************************************** 加入数据结构中
		Message cme = MessageExt.prepareChatMessageData_incoming(
						msgBody.getF()
                        // 消息发送人的昵称
						, msgBody.getNickName()
						, msgBody.getM()
						, context
						// 如果是实时消息则显示时间取本机HH:mm格式的时间，否则按服务端的MM-dd HH:mm格式的日期时间显示哦
						, time<=0? ToolKits.getTimeStamp():time
						, msgBody.getTy());
		if(cme != null) {
			// 消息的指纹码（也就是唯一ID啦）
			cme.setFingerPrintOfProtocal(fingerPrint);
			// 群聊消息需要记录下扩散写前由消息发起者发出消息的原始指纹码（以便消息"撤回"功能时使用）
			cme.setFingerPrintOfParent(msgBody.getParentFp());

			// 将"收到的"消息放入数据结构
			MyApplication.getInstance(context).getIMClientManager().getGroupsMessagesProvider().putMessage(context, gid, cme);
		}
		
		//***************************************************************** 声音提示
		if (playPromtAudio && PreferencesToolkits.isChatMsgToneOpen(context, gid))
			// 来一个声音提示
			PromtHelper.messagePromt(context);
		
		//***************************************************************** 首页消息和系统Notification提示
		int flagNumToAdd = 0;
		// 当前群聊天的界面处于后台时的消息提示
		if(MyApplication.getInstance(context).getIMClientManager().getCurrentFrontGroupChattingGroupID() == null
				|| !MyApplication.getInstance(context).getIMClientManager().getCurrentFrontGroupChattingGroupID().equals(gid)) {

			// 未读消息数+1（当且仅当聊天界面处于后台时）
			flagNumToAdd += 1;
			// 系统Nitification通知
			if(showNotification && PreferencesToolkits.isChatMsgToneOpen(context, gid)) {
				// 来一个Android系统Notification通知哦
				NotificationPromptHelper.showAGroupChatMsgNotivication(context, GroupEntity.isWorldChat(gid), msgBody.getTy(), msgBody.getM(), msgBody.getNickName(), gid, gname);
			}
		}

		// 世界频道的
		if(GroupEntity.isWorldChat(gid)) {
			// 无条件加一个提示到首页消息界面中
			MyApplication.getInstance(context).getIMClientManager().getAlarmsProvider().setBBSMsgAlarm(msgBody, flagNumToAdd); // 未读临时消息数+1
		}
		// 普通群聊的
		else {
			// 无条件加一个提示到首页消息列表中（就像主流IM微信一样，可以很方便的找到最近聊天的人）
			MyApplication.getInstance(context).getIMClientManager().getAlarmsProvider().addAGroupChatMsgAlarm(
							msgBody.getTy()
							, gid
							, gname
							, msgBody.getNickName()  // 群聊消息发起者的昵称
							, msgBody.getM()         // 消息内容
							, time
							, flagNumToAdd           // 未读临时消息数+1
					);
		}
	}
	
	public static Message addChatMessageData_outgoing(Context context, String gid, Message entity)
	{
		// 本地发出的群聊消息作为到服务端被扩散写为其它群员消息的"父"消息，是没有"父"指纹码的，为了
		// 让处理本地发出的和收到的群聊消息在撤回逻辑上的代码，所以把自身的这条消息的指纹码也填到了
		// fingerPrintOfParent字段里，这在逻辑上并没有什么问题，可以放心处理
		entity.setFingerPrintOfParent(entity.getFingerPrintOfProtocal());

		// 将一条（”发出的“）消息放到该好友的消息列表中（放进去时会自动通知列表的观察者，而观察者将会实现ui的刷新）
		MyApplication.getInstance(context).getIMClientManager().getGroupsMessagesProvider().putMessage(context, gid, entity);
		return entity;
	}
}
